package com.vcoud.mundialbrasil2014;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
import java.util.Timer;
import java.util.TimerTask;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.vcoud.mbrasil2014.R;

public class SplashScreenActivity extends Activity {

	public static final String PREFS_NAME = "Preferencias";
	Timer timer = new Timer();
	// Set the duration of the splash screen
	Activity activity = this;
	ActualizacionService actualizacion;
	static final String DB_NOMBRE = "mundial.db";
	static final String URL = ActualizacionService.URL;
	RelativeLayout rlVista1Vez;
	ProgressBar progreso;
	TextView tvPorcentaje;
	ProgressBar spinner;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
				.detectDiskReads().detectDiskWrites().detectNetwork()
				.penaltyLog().build());

		// Set portrait orientation
		setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
		// Hide title bar
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.splash_screen);
		actualizacion = new ActualizacionService(this);
		rlVista1Vez = (RelativeLayout) findViewById(R.id.primera_vez);
		tvPorcentaje = (TextView) findViewById(R.id.porcentaje);
		progreso = (ProgressBar) findViewById(R.id.barra_progreso);
		spinner = (ProgressBar) findViewById(R.id.progressBarSplash);
	}

	@Override
	protected void onPostCreate(Bundle savedInstanceState) {
		super.onPostCreate(savedInstanceState);
		if (checkearDb()) {
			TimerTask task = new TimerTask() {
				@Override
				public void run() {
					actualizacion.actualizacionDeInicio();
					Intent mainIntent = new Intent().setClass(
							SplashScreenActivity.this, MainActivity.class);
					mainIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
					// Start the next activity
					startActivity(mainIntent);

					// Close the activity so the user won't able to go back this
					// activity pressing Back button
					timer.cancel();
					finish();
				}
			};
			timer.schedule(task, 1);
		} else {
			ActualizacionCompleta act = new ActualizacionCompleta();
			act.execute();
			// Toast.makeText(getBaseContext(),
			// activity.getString(R.string.primera_actualizacion),
			// Toast.LENGTH_LONG).show();
			//
			// TimerTask task = new TimerTask() {
			// @Override
			// public void run() {
			// }
			// };
			// timer.schedule(task, 1);
		}
	}

	public boolean checkearDb() {
		File dbFile = getBaseContext().getDatabasePath(DB_NOMBRE);
		if (dbFile.exists()) {
			DB db = new DB(this);
			db.abrir();
			if (DB.DB_ACTUALIZADA) {

				return false;
			}
			db.cerrar();
		}
		return dbFile.exists();
	}

	private class ActualizacionCompleta extends
			AsyncTask<String, Integer, Boolean> {

		@Override
		protected void onPreExecute() {
			spinner.setVisibility(View.GONE);
			rlVista1Vez.setVisibility(View.VISIBLE);
			progreso.setProgress(0);
			progreso.setMax(100);
		}

		@Override
		protected Boolean doInBackground(String... equipos) {
			try {
				publishProgress(0);
				Log.v("Sync", "Iniciando sincronizacion completa");
				ArrayList<NameValuePair> mParamActualizar = new ArrayList<NameValuePair>();
				ArrayList<NameValuePair> mParamEquipo = new ArrayList<NameValuePair>();
				ArrayList<NameValuePair> mParamSede = new ArrayList<NameValuePair>();
				ArrayList<NameValuePair> mParamEtapaMundial = new ArrayList<NameValuePair>();
				ArrayList<NameValuePair> mParamJugador = new ArrayList<NameValuePair>();
				ArrayList<NameValuePair> mParamPartido = new ArrayList<NameValuePair>();
				ArrayList<NameValuePair> mParamGol = new ArrayList<NameValuePair>();
				DB db = new DB(activity);
				db.abrirConEscritura();
				mParamActualizar
						.add(new BasicNameValuePair("tc", "actualizar"));
				mParamEquipo.add(new BasicNameValuePair("tc", "equipo"));
				mParamSede.add(new BasicNameValuePair("tc", "sede"));
				mParamEtapaMundial.add(new BasicNameValuePair("tc",
						"etapamundial"));
				mParamJugador.add(new BasicNameValuePair("tc", "jugador"));
				mParamPartido.add(new BasicNameValuePair("tc", "partido"));
				mParamGol.add(new BasicNameValuePair("tc", "gol"));
				String mRespuestaActualizar = null;
				String mRespuestaEquipo = null;
				String mRespuestaSede = null;
				String mRespuestaEtapaMundial = null;
				String mRespuestaJugador = null;
				String mRespuestaPartido = null;
				String mRespuestaGol = null;
				JSONArray mResultadoActualizar = null;
				JSONArray mResultadoPartido = null;
				JSONArray mResultadoGol = null;
				JSONArray mResultadoEquipo = null;
				JSONArray mResultadoSede = null;
				JSONArray mResultadoEtapaMundial = null;
				JSONArray mResultadoJugador = null;

				/** Sincronización de actualizar **/
				publishProgress(2);
				try {
					Log.v("Sync", "Sincronizando actualizar...");
					mRespuestaActualizar = ClienteHttp.ejecutarHttpPost(URL,
							mParamActualizar);
					mResultadoActualizar = new JSONArray(mRespuestaActualizar);
					publishProgress(9);
					for (int i = 0; i < mResultadoActualizar.length(); i++) {
						db.insertarActualizacion(
								mResultadoActualizar.getJSONObject(i).getInt(
										"IDActualizar"),
								mResultadoActualizar.getJSONObject(i)
										.getString("Tabla"),
								mResultadoActualizar.getJSONObject(i).getInt(
										"Version"));
					}
				} catch (JSONException e) {
					e.printStackTrace();
				}
				publishProgress(16);
				/** Sincronizacion de equipo **/

				try {
					Log.v("Sync", "Sincronizando equipo...");
					mRespuestaEquipo = ClienteHttp.ejecutarHttpPost(URL,
							mParamEquipo);
					mResultadoEquipo = new JSONArray(mRespuestaEquipo);
					publishProgress(23);
					for (int i = 0; i < mResultadoEquipo.length(); i++) {
						// adding each child node to HashMap key => value

						db.insertarEquipo(
								mResultadoEquipo.getJSONObject(i).getInt(
										"IDEquipo"),
								mResultadoEquipo.getJSONObject(i).getString(
										"Nombre"),
								mResultadoEquipo.getJSONObject(i).getString(
										"Bandera"),
								mResultadoEquipo.getJSONObject(i).getString(
										"Escudo"),
								mResultadoEquipo.getJSONObject(i).getString(
										"Grupo"),
								mResultadoEquipo.getJSONObject(i).getString(
										"Descripcion"),
								mResultadoEquipo.getJSONObject(i).getInt(
										"Activo"),
								mResultadoEquipo.getJSONObject(i).getString(
										"Color"),
								mResultadoEquipo.getJSONObject(i).getInt(
										"Ganados"),
								mResultadoEquipo.getJSONObject(i).getInt(
										"Empatados"),
								mResultadoEquipo.getJSONObject(i).getInt(
										"Perdidos"),
								mResultadoEquipo.getJSONObject(i).getString(
										"Camisa"),
								mResultadoEquipo.getJSONObject(i).getInt(
										"Puntos"),
								mResultadoEquipo.getJSONObject(i).getInt(
										"GolesFavor"),
								mResultadoEquipo.getJSONObject(i).getInt(
										"GolesContra"),
								mResultadoEquipo.getJSONObject(i).getInt(
										"DiferenciaGoles"));

					}
				} catch (JSONException e) {
					Log.e("Sync", "Error al sincronizar equipo.");
					e.printStackTrace();
				}
				publishProgress(30);
				/** Sincronizacion de sede **/

				try {
					Log.v("Sync", "Sincronizando sede...");
					mRespuestaSede = ClienteHttp.ejecutarHttpPost(URL,
							mParamSede);
					mResultadoSede = new JSONArray(mRespuestaSede);
					publishProgress(37);
					for (int i = 0; i < mResultadoSede.length(); i++) {

						db.insertarSede(
								mResultadoSede.getJSONObject(i)
										.getInt("IDSede"),
								mResultadoSede.getJSONObject(i).getString(
										"Nombre"),
								mResultadoSede.getJSONObject(i).getString(
										"NombreEstado"),
								mResultadoSede.getJSONObject(i).getString(
										"Imagen"),
								mResultadoSede.getJSONObject(i).getString(
										"Descripcion"));
					}
				} catch (JSONException e) {
					Log.e("Sync", "Error al sincronizar sede.");
					e.printStackTrace();
				}
				publishProgress(44);
				/** Sincronizacion de etapa mundial **/

				try {
					Log.v("Sync", "Sincronizando etapa mundial...");
					mRespuestaEtapaMundial = ClienteHttp.ejecutarHttpPost(URL,
							mParamEtapaMundial);
					mResultadoEtapaMundial = new JSONArray(
							mRespuestaEtapaMundial);
					publishProgress(51);
					for (int i = 0; i < mResultadoEtapaMundial.length(); i++) {

						db.insertarEtapaMundial(mResultadoEtapaMundial
								.getJSONObject(i).getInt("IDEtapaMundial"),
								mResultadoEtapaMundial.getJSONObject(i)
										.getString("Nombre"));

					}
				} catch (JSONException e) {
					Log.e("Sync", "Error al sincronizar etapa mundial.");
					e.printStackTrace();
				}
				publishProgress(58);
				/** Sincronizacion de jugadores **/

				try {
					Log.v("Sync", "Sincronizando jugador...");
					mRespuestaJugador = ClienteHttp.ejecutarHttpPost(URL,
							mParamJugador);
					mResultadoJugador = new JSONArray(mRespuestaJugador);
					publishProgress(69);
					for (int i = 0; i < mResultadoJugador.length(); i++) {

						db.insertarJugador(
								mResultadoJugador.getJSONObject(i).getInt(
										"IDJugador"),
								mResultadoJugador.getJSONObject(i).getString(
										"Nombre"),
								mResultadoJugador.getJSONObject(i).getString(
										"Apellido"),
								mResultadoJugador.getJSONObject(i).getString(
										"Descripcion"),
								mResultadoJugador.getJSONObject(i).getString(
										"Club"),
								mResultadoJugador.getJSONObject(i).getInt(
										"Numero"),
								mResultadoJugador.getJSONObject(i).getString(
										"Posicion"),
								mResultadoJugador.getJSONObject(i).getString(
										"Foto"),
								mResultadoJugador.getJSONObject(i).getInt(
										"FK_Equipo"),
								mResultadoJugador.getJSONObject(i)
										.getInt("Gol"),
								mResultadoJugador.getJSONObject(i).getInt(
										"Asistencia"),
								mResultadoJugador.getJSONObject(i).getInt(
										"TarjetaAmarilla"),
								mResultadoJugador.getJSONObject(i).getInt(
										"TarjetaRoja"),
								mResultadoJugador.getJSONObject(i).getInt(
										"Capitan"),
								mResultadoJugador.getJSONObject(i).getInt(
										"Lesionado"));

					}
				} catch (JSONException e) {
					Log.e("Sync", "Error al sincronizar jugador.");
					e.printStackTrace();
				}
				publishProgress(76);
				/** Sincronizacion de partido **/

				try {
					Log.v("Sync", "Sincronizando partido...");
					mRespuestaPartido = ClienteHttp.ejecutarHttpPost(URL,
							mParamPartido);
					mResultadoPartido = new JSONArray(mRespuestaPartido);
					publishProgress(75);
					for (int i = 0; i < mResultadoPartido.length(); i++) {
						String mRawFecha = mResultadoPartido.getJSONObject(i)
								.getString("Fecha");
						SimpleDateFormat formatoInicial = new SimpleDateFormat(
								"yyyy-MM-dd HH:mm:ss", Locale.US);
						formatoInicial.setTimeZone(TimeZone
								.getTimeZone("America/Caracas"));
						Date mFecha = formatoInicial.parse(mRawFecha);
						TimeZone tzUsuario = TimeZone.getDefault();
						SimpleDateFormat formatoFinal = new SimpleDateFormat(
								"yyyy-MM-dd HH:mm:ss", Locale.US);
						formatoFinal.setTimeZone(tzUsuario);
						String mFechaConvertida = formatoFinal.format(mFecha);
						db.insertarPartido(
								mResultadoPartido.getJSONObject(i).getInt(
										"IDPartido"),
								mResultadoPartido.getJSONObject(i).getInt(
										"FK_EquipoLocal"),
								mResultadoPartido.getJSONObject(i).getInt(
										"FK_EquipoVisitante"),
								mResultadoPartido.getJSONObject(i).getInt(
										"FK_Sede"),
								mFechaConvertida,
								mResultadoPartido.getJSONObject(i).getString(
										"NombreArbitro"),
								mResultadoPartido.getJSONObject(i).getInt(
										"GolLocal"),
								mResultadoPartido.getJSONObject(i).getInt(
										"GolVisitante"),
								mResultadoPartido.getJSONObject(i).getInt(
										"GolLocalTiempoExtra"),
								mResultadoPartido.getJSONObject(i).getInt(
										"GolVisitanteTiempoExtra"),
								mResultadoPartido.getJSONObject(i).getInt(
										"GolLocalPenal"),
								mResultadoPartido.getJSONObject(i).getInt(
										"GolVisitantePenal"),
								mResultadoPartido.getJSONObject(i).getInt(
										"FK_EtapaMundial"));
					}
				} catch (JSONException e) {
					Log.e("Sync", "Error al sincronizar partido.");
					e.printStackTrace();
				}
				publishProgress(86);
				/** Sincronizacion de gol **/

				try {
					Log.v("Sync", "Sincronizando gol...");
					mRespuestaGol = ClienteHttp
							.ejecutarHttpPost(URL, mParamGol);
					mResultadoGol = new JSONArray(mRespuestaGol);
					publishProgress(93);
					for (int i = 0; i < mResultadoGol.length(); i++) {

						db.insertarGol(
								mResultadoGol.getJSONObject(i).getInt("IDGol"),
								mResultadoGol.getJSONObject(i).getInt(
										"FK_Jugador"),
								mResultadoGol.getJSONObject(i).getInt(
										"FK_Partido"),
								mResultadoGol.getJSONObject(i).getInt("Minuto"),
								mResultadoGol.getJSONObject(i)
										.getInt("AutoGol"), mResultadoGol
										.getJSONObject(i)
										.getString("RutaVideo"), mResultadoGol
										.getJSONObject(i).getInt("FK_Equipo"));

					}

				} catch (JSONException e) {
					Log.e("Sync", "Error al sincronizar gol.");
					e.printStackTrace();
				}

				db.cerrar();
				Log.v("Sync", "Sincronizacion terminada");
				publishProgress(100);
				return true;
			} catch (Exception e) {
				e.printStackTrace();
				Log.w("Sync", "Hubieron errores en la sincronizacion");
				publishProgress(100);
				return false;
			}
		}

		@Override
		protected void onProgressUpdate(Integer... values) {
			super.onProgressUpdate(values);
			tvPorcentaje.setText(values[0] + " %");
			progreso.setProgress(values[0]);
		}

		@Override
		protected void onPostExecute(Boolean result) {
			if (result) {
				Intent mainIntent = new Intent().setClass(
						SplashScreenActivity.this, MainActivity.class);
				mainIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
				// Start the next activity
				startActivity(mainIntent);

				// Close the activity so the user won't able to go back
				// this
				// activity pressing Back button
				finish();
			} else {
				File dbFile = getBaseContext().getDatabasePath(DB_NOMBRE);
				dbFile.delete();
				activity.runOnUiThread(new Runnable() {
					@Override
					public void run() {
						AlertDialog.Builder constructor = new AlertDialog.Builder(
								activity);
						constructor
								.setCancelable(false)
								.setTitle(
										activity.getString(R.string.inicio_sin_conexion_1era_titulo))
								.setMessage(
										activity.getString(R.string.inicio_sin_conexion_1era_texto))
								.setNegativeButton(
										activity.getString(R.string.ok),
										new DialogInterface.OnClickListener() {
											public void onClick(
													DialogInterface dialog,
													int id) {
												System.exit(0);
											}
										});
						AlertDialog alerta = constructor.create();
						alerta.show();
					}
				});
			}
		}
	}

}